package cn.jolyoulu.common.web.filter;


import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.WriteListener;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * @Author: JolyouLu
 * @Date: 2023/1/21 16:17
 * @Description 构建可重复读取的Response
 */
public class MultiReadHttpServletResponseWrapper extends HttpServletResponseWrapper {

    //我们获取响应数据的流
    private ByteArrayOutputStream byteArrayOutputStream;

    public MultiReadHttpServletResponseWrapper(HttpServletResponse response) {
        super(response);
        byteArrayOutputStream = new ByteArrayOutputStream();
    }

    /**
     * 重写getOutputStream方法
     * 返回一个可以重复读的 ServletInputStream
     *
     * @return
     */
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setWriteListener(WriteListener writeListener) {

            }

            //这个最重要，是在这里将响应数据写到这个类的byteArrayOutputStream中的，
            //这样我们后续才能拿到响应数据
            //也正是因为这样，实际的HttpResponse对象中是没有被写入数据的
            @Override
            public void write(int b) throws IOException {
                byteArrayOutputStream.write(b);
            }
        };
    }

    public byte[] toByteArray() {
        return byteArrayOutputStream.toByteArray();
    }

    public ByteArrayOutputStream getByteArrayOutputStream() {
        return byteArrayOutputStream;
    }

    public void setByteArrayOutputStream(ByteArrayOutputStream byteArrayOutputStream) {
        this.byteArrayOutputStream = byteArrayOutputStream;
    }
}
